package com.yswee.framework.widget.adapterview.withmodel;

import java.util.ArrayList;

import com.yswee.framework.data.BaseArrayData;
import com.yswee.framework.model.BaseListModel;
import com.yswee.framework.model.PageType;
import com.yswee.framework.net.http.Callback;
import com.yswee.framework.net.http.Entity;

import android.content.Context;
import android.util.AttributeSet;

public abstract class MListView<T> extends com.yswee.framework.widget.adapterview.MListView<T> {

	protected BaseListModel<T> mModel;
	protected BaseArrayData<T> mModelData; 
	
	/**
	 * 获取BaseListModel返回的数据实体
	 * @return
	 */
	public BaseArrayData<T> getModelData() {
		return mModelData;
	}
	
	protected Callback<BaseArrayData<T>> mCallback = new Callback<BaseArrayData<T>>() {
		@Override
		public void onFinish(Entity<BaseArrayData<T>> entity) {
			mModelData = entity.getParsedData();
			boolean isok = true;
			if(getPageType() != PageType.CachePage) {
				isok= entity.getParser().getIsOk();
			}
			if(isok) {
				if(mModelData != null && mModelData.getArray() != null) {
					if(mModelData.getArray().size() < 1) {
						onLoadBlank(entity, getPageType());
						return;
					} else {
						onLoadSucc(entity, getPageType());
						if (mModelData.isLastPage()) {
							onEndLoad(true);
						}
						return;
					}
				}
			}
			onLoadError(entity, getPageType());
		}

		@Override
		public void onError(Entity<BaseArrayData<T>> entity) {
			onLoadError(entity, getPageType());
		}
	};
	
	public MListView(Context context) {
		this(context, null);
	}
	
	public MListView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}
	
	public MListView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}
	
	/**
	 *数据请求完成
	 * @param entity
	 * @param data
	 * @param pagetype
	 */
	protected void onLoadSucc(Entity<BaseArrayData<T>> entity, PageType pagetype) {
		ArrayList<T> data = mModelData.getArray(); 
		if(pagetype != PageType.CachePage) {
			onEndLoad(false);
		}
		if(pagetype == PageType.CachePage) {
			setDataSource(data);
			if(scrollToEdgeOnGetCacheData()) {
				if(getLoadMoreMode() == MODE_LOADMORE_BOTTOM) {
					scrollToTop();
				} else {
					scrollToBottom();
				}
			}
		} else if(pagetype == PageType.FirstPage) {
			if(clearListOnRefreshData()) {
				setDataSource(data);
			} else {
				ArrayList<T> olddatas = getDataSource();
				if(olddatas == null) {
					olddatas = new ArrayList<T>();
				}
				if(getLoadMoreMode() == MODE_LOADMORE_BOTTOM) {
					olddatas.addAll(0, data);
				} else {
					olddatas.addAll(data);
				}
				setDataSource(olddatas);
			}
			if(scrollToEdgeOnGetFirstPage()) {
				if(getLoadMoreMode() == MODE_LOADMORE_BOTTOM) {
					scrollToTop();
				} else {
					scrollToBottom();
				}
			}
		} else {
			ArrayList<T> olddatas = getDataSource();
			if(olddatas == null) {
				olddatas = new ArrayList<T>();
			}
			if(getLoadMoreMode() == MODE_LOADMORE_BOTTOM) {
				olddatas.addAll(data);
			} else {
				olddatas.addAll(0, data);
			}
			setDataSource(olddatas);
			if(getLoadMoreMode() != MODE_LOADMORE_BOTTOM) {
				setSelection(data.size());
			}
		}
	}
	
	/**
	 * 数据请求完成（空数据）
	 * @param entity
	 * @param pagetype
	 */
	protected void onLoadBlank(Entity<BaseArrayData<T>> entity, PageType pagetype) {
		if(pagetype != PageType.CachePage) {
			onEndLoad(true);
		}
		if(pagetype == PageType.FirstPage) {
			if(clearListOnRefreshData()) {
				setDataSource(new ArrayList<T>());
			}
		}
	}
	
	/**
	 * 数据请求出错
	 * @param entity
	 * @param pagetype
	 */
	protected void onLoadError(Entity<BaseArrayData<T>> entity, PageType pagetype) {
		if(pagetype != PageType.CachePage) {
			onEndLoad(false);
		}
	}
	
	/**
	 * 取得缓存数据
	 */
	public void getCacheData() {
		if(mModel == null) {
			mModel = createMode();
		}
		if(mModel == null) {
			throw new RuntimeException("mModel is null");
		}
		mModel.getCacheData(mCallback);
	}
	
	/**
	 * 请求第一页数据
	 */
	@Override
	public void getFirstPage() {
		getFirstPage(true);
	}
	
	/**
	 * 请求第一页数据
	 * @param loadcache 是否加载缓存
	 */
	public void getFirstPage(boolean loadcache) {
		if (mIsBusy) {
			return;
		}
		if (!isReadyLoadData(true)) {
			return;
		}
		if (mModel == null) {
			mModel = createMode();
		}
		if (mModel == null) {
			throw new RuntimeException("mModel is null");
		}
		if (mModel.getFirstPage(loadcache, mCallback)) {
			onBeginLoad(true);
		}
	}
	
	/**
	 * 请求下一页数据
	 */
	@Override
	public void getNextPage() {
		if (mIsBusy) {
			return;
		}
		if (!isReadyLoadData(false)) {
			return;
		}
		super.getNextPage();
		if (mModel == null) {
			mModel = createMode();
		}
		if (mModel == null) {
			throw new RuntimeException("mModel is null");
		}
		mModel.getNextPage(mCallback);
	}
	
	/**
	 * 请求第一页数据返回后是否清空原列表数据
	 * @return
	 */
	protected boolean clearListOnRefreshData() {
		return true;
	}
	
	/**
	 * 请求第一页数据返回后是否滑动至顶部或底部
	 * @return
	 */
	protected boolean scrollToEdgeOnGetFirstPage() {
		return true;
	}
	
	/**
	 * 请求缓存数据返回后是否滑动至顶部或底部
	 * @return
	 */
	protected boolean scrollToEdgeOnGetCacheData() {
		return false;
	}
	
	/**
	 * 取得Model
	 * @return
	 */
	public BaseListModel<T> getModel() {
		return mModel;
	}
	
	/**
	 * 生成Model
	 * @return
	 */
	protected abstract BaseListModel<T> createMode();
}
